iT邦幫忙

2024 iThome 鐵人賽

DAY 14
0
佛心分享-我的私藏工具箱

正則!好好表達系列 第 14

讀環境變數並解析成Lua的Table物件

  • 分享至 

  • xImage
  •  

Nginx及其姊妹OpenResty皆可用Lua語言來客製化系統功能,Redis、Unity 3D也是有支援Lua。
這裡是講Lua在OpenResty上怎麼讀環境變數寫到Table物件,table是Lua裡較複雜的資料結構。
環境變數redis_host內容為:

10.0.1.13:7000,10.0.1.13:7001,10.0.1.13:7002,10.0.1.14:7000,10.0.1.14:7001,10.0.1.14:7002

Lua程式解析環境變數存到Table如下:

local hosts = os.getenv("redis_host")
local host_list = {}
for k, v in string.gmatch(hosts, "([%w.]+):(%w+)") do
    local serv = {ip = k, port = tonumber(v)}
    table.insert(host_list, serv)
end
  • os.getenv("redis_host") 讀環境變數寫到hosts變數裡。
  • local host_list = {} 宣告host_list為table物件變數。
  • hosts變數內容是以ip:port成一筆,並用逗號分隔,在Lua的Regex,是用%w替代\w,透過string.gmatch("([%w.]+):(%w+)")取得k(IP值)和v(port)值。所以比對IP部份會多一個小數點。

這在resty指令下可以work。但到OpenResty,使用上有其限制,只能在init_by_lua區塊使用os.getenv,是故在OpenResty要分成兩段寫:
一、在init_by_lua區域取值設給Global變數,也只有在init_by_lua區塊才能使用Global變數。此處Global變數為redis_host

init_by_lua_block{
    redis_host = os.getenv("redis_host")
}

二、在location區域的content_by_lua等區塊可以直接使用redis_host這個變數。


上一篇
遮蔽敏感性資訊的Perl
系列文
正則!好好表達14
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言